/**
 * 附件实体类型定义
 */
export interface Attachment {
  /** 附件ID */
  id?: number;
  
  /** 文件名 */
  fileName: string;
  
  /** 原始文件名 */
  originalFileName?: string;
  
  /** 文件大小（字节） */
  fileSize: number;
  
  /** 文件大小（格式化显示） */
  fileSizeText?: string;
  
  /** 文件类型 */
  fileType?: string;
  
  /** 文件扩展名 */
  fileExtension?: string;
  
  /** 文件URL */
  fileUrl?: string;
  
  /** 文件路径 */
  filePath?: string;
  
  /** 上传日期 */
  uploadDate: string;
  
  /** 上传人 */
  uploadBy?: string;
  
  /** 关联实体类型 */
  entityType?: string;
  
  /** 关联实体ID */
  entityId?: number;
  
  /** 附件描述 */
  description?: string;
  
  /** 是否删除 */
  isDeleted?: boolean;
  
  /** 创建时间 */
  createTime?: string;
  
  /** 创建人 */
  createName?: string;
  
  /** 修改时间 */
  updateTime?: string;
  
  /** 修改人 */
  updateName?: string;
}

/**
 * 附件上传响应类型
 */
export interface AttachmentUploadResponse {
  /** 响应代码 */
  code: number;
  
  /** 响应消息 */
  message: string;
  
  /** 响应数据 */
  data: {
    /** 文件URL */
    url: string;
    
    /** 文件路径 */
    path: string;
    
    /** 文件名 */
    fileName: string;
    
    /** 文件大小 */
    fileSize: number;
    
    /** 文件类型 */
    fileType: string;
  };
}

/**
 * 附件上传参数类型
 */
export interface AttachmentUploadParams {
  /** 文件对象 */
  file: File;
  
  /** 关联实体类型 */
  entityType?: string;
  
  /** 关联实体ID */
  entityId?: number;
  
  /** 附件描述 */
  description?: string;
}

/**
 * 附件删除参数类型
 */
export interface AttachmentDeleteParams {
  /** 附件ID */
  id: number;
  
  /** 关联实体类型 */
  entityType?: string;
  
  /** 关联实体ID */
  entityId?: number;
}

/**
 * 附件查询参数类型
 */
export interface AttachmentQueryParams {
  /** 关联实体类型 */
  entityType?: string;
  
  /** 关联实体ID */
  entityId?: number;
  
  /** 文件名（模糊查询） */
  fileName?: string;
  
  /** 文件类型 */
  fileType?: string;
  
  /** 上传人 */
  uploadBy?: string;
  
  /** 开始日期 */
  startDate?: string;
  
  /** 结束日期 */
  endDate?: string;
  
  /** 页码 */
  pageIndex?: number;
  
  /** 页大小 */
  pageSize?: number;
}

/**
 * 附件列表响应类型
 */
export interface AttachmentListResponse {
  /** 响应代码 */
  code: number;
  
  /** 响应消息 */
  message: string;
  
  /** 响应数据 */
  data: {
    /** 总数 */
    totalCount: number;
    
    /** 页数 */
    pageCount: number;
    
    /** 页面数据 */
    pageData: Attachment[];
  };
}

/**
 * 文件类型枚举
 */
export enum FileType {
  /** 图片 */
  IMAGE = 'image',
  
  /** 文档 */
  DOCUMENT = 'document',
  
  /** 视频 */
  VIDEO = 'video',
  
  /** 音频 */
  AUDIO = 'audio',
  
  /** 压缩包 */
  ARCHIVE = 'archive',
  
  /** 其他 */
  OTHER = 'other'
}

/**
 * 支持的文件类型配置
 */
export const SUPPORTED_FILE_TYPES:any = {
  // 图片类型
  image: {
    extensions: ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp'],
    mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'image/bmp', 'image/webp'],
    maxSize: 10 * 1024 * 1024, // 10MB
    icon: 'el-icon-picture'
  },
  
  // 文档类型
  document: {
    extensions: ['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.txt'],
    mimeTypes: [
      'application/pdf',
      'application/msword',
      'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
      'application/vnd.ms-excel',
      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      'application/vnd.ms-powerpoint',
      'application/vnd.openxmlformats-officedocument.presentationml.presentation',
      'text/plain'
    ],
    maxSize: 50 * 1024 * 1024, // 50MB
    icon: 'el-icon-document'
  },
  
  // 视频类型
  video: {
    extensions: ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv'],
    mimeTypes: ['video/mp4', 'video/avi', 'video/quicktime', 'video/x-ms-wmv', 'video/x-flv', 'video/x-matroska'],
    maxSize: 500 * 1024 * 1024, // 500MB
    icon: 'el-icon-video-camera'
  },
  
  // 音频类型
  audio: {
    extensions: ['.mp3', '.wav', '.flac', '.aac', '.ogg'],
    mimeTypes: ['audio/mpeg', 'audio/wav', 'audio/flac', 'audio/aac', 'audio/ogg'],
    maxSize: 100 * 1024 * 1024, // 100MB
    icon: 'el-icon-headset'
  },
  
  // 压缩包类型
  archive: {
    extensions: ['.zip', '.rar', '.7z', '.tar', '.gz'],
    mimeTypes: ['application/zip', 'application/x-rar-compressed', 'application/x-7z-compressed', 'application/x-tar', 'application/gzip'],
    maxSize: 200 * 1024 * 1024, // 200MB
    icon: 'el-icon-folder'
  }
}

/**
 * 获取文件类型
 * @param fileName 文件名
 * @returns 文件类型
 */
export function getFileType(fileName: string): FileType {
  const extension = fileName.toLowerCase().substring(fileName.lastIndexOf('.'));
  
  for (const [type, config] of Object.entries(SUPPORTED_FILE_TYPES)) {
    if ((config as any).extensions.includes(extension)) {
      return type as FileType;
    }
  }
  
  return FileType.OTHER;
}

/**
 * 格式化文件大小
 * @param bytes 字节数
 * @returns 格式化后的文件大小
 */
export function formatFileSize(bytes: number): string {
  if (bytes === 0) return '0 Bytes';
  
  const k = 1024;
  const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}

/**
 * 验证文件类型
 * @param file 文件对象
 * @returns 是否支持的文件类型
 */
export function validateFileType(file: File): boolean {
  const fileType = getFileType(file.name);
  const config = SUPPORTED_FILE_TYPES[fileType];
  
  if (!config) {
    return false;
  }
  
  return (config as any).mimeTypes.includes(file.type) || (config as any).extensions.some((ext: string) => file.name.toLowerCase().endsWith(ext));
}

/**
 * 验证文件大小
 * @param file 文件对象
 * @returns 是否在允许的大小范围内
 */
export function validateFileSize(file: File): boolean {
  const fileType = getFileType(file.name);
  const config = SUPPORTED_FILE_TYPES[fileType];
  
  if (!config) {
    return file.size <= 10 * 1024 * 1024; // 默认10MB
  }
  
  return file.size <= (config as any).maxSize;
}

/**
 * 获取文件图标
 * @param fileName 文件名
 * @returns 图标类名
 */
export function getFileIcon(fileName: string): string {
  const fileType = getFileType(fileName);
  const config = SUPPORTED_FILE_TYPES[fileType];
  
  return config ? (config as any).icon : 'el-icon-document';
}

// 后端Attachment实体对应的类型
export interface BackendAttachment {
    id?: number
    filename: string
    filepath: string
    filesize: number
    uploadtime: string
    entitytype: string
    entityid: number
    createTime?: string
    createName?: string
    updateTime?: string
    updateName?: string
    isDeleted?: boolean
}

// 附件添加DTO
export interface AttachmentAddDTO {
    filename: string
    filepath: string
    filesize: number
    entitytype: string
    entityid: number
    createName?: string
}

// 批量添加附件DTO
export interface AttachmentBatchAddDTO {
    attachments: AttachmentAddDTO[]
}

